﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;


using Modelo_ETdA.Negocio.Analise.Avaliacao;
using Modelo_ETdA.Negocio.Analise.Formato;

namespace Modelo_ETdA.Negocio.Analise.Relatorio
{
    public class RelatorioCliente : Relatorio
    {
        private List<Avaliacao.Avaliacao> l_aval_cli;
        private FormatoAvaliacaoCliente form_aval_cli;
        private int num;
        private int numFeminino;
        private int numMasculino;
        private List<int> listaIdades;
        private Dictionary<int, int> mapHabilQtd;

        private List<DistribuicaoRespostas> listDistRespostas;


        public RelatorioCliente(List<Avaliacao.Avaliacao> avaliacaoCliente, FormatoAvaliacaoCliente form_aval_cli, AmbienteComercial.AmbienteComercial ambC)
            : base(ambC)
        {
            this.l_aval_cli = avaliacaoCliente;
            this.form_aval_cli = form_aval_cli;
            this.listaIdades = new List<int>();
            this.mapHabilQtd = new Dictionary<int, int>();
            this.listDistRespostas = new List<DistribuicaoRespostas>();
        }


        private void calcular()
        {
            num = l_aval_cli.Count();
            int cod_habil;
            DistribuicaoRespostas aux_dist;

            int cod_questao;
            int val_resp;
            Questao quest_cli;

            int numRespNeg = 0;
            int numRespSatisf = 0;
            int numRespPos = 0;

            DistribuicaoRespostas aux_d_resp;

            foreach (Avaliacao.Avaliacao aval in l_aval_cli)
            {
                Questionario quest = (Questionario)aval;

                if (quest.Genero) numMasculino++;
                else numFeminino++;

                if (quest.Idade != -1) listaIdades.Add(quest.Idade);

                cod_habil = quest.CodHabilitacao;

                if (cod_habil != -1)
                {
                    if (mapHabilQtd.ContainsKey(cod_habil)) mapHabilQtd[cod_habil] += 1;
                    else mapHabilQtd.Add(cod_habil, 1);
                }



                foreach (Resposta resp in quest.Respostas)
                {
                    cod_questao = resp.CodQuestao;
                    val_resp = resp.ValorResposta;
                    if (val_resp != -1)
                    {
                        quest_cli = form_aval_cli.getQuestao(cod_questao);
                        switch (getSatisf(val_resp, quest_cli.EscalaMin, quest_cli.EscalaMax, quest_cli.MinResposta))
                        {
                            case 0: numRespNeg++; break;
                            case 1: numRespSatisf++; break;
                            case 2: numRespPos++; break;
                        }

                        aux_d_resp = getDistResp(quest_cli.CodConsideracao);

                        if (aux_d_resp == null)
                        {
                            aux_dist = new DistribuicaoRespostas(numRespNeg, numRespSatisf, numRespPos, quest_cli.CodConsideracao);
                            listDistRespostas.Add(aux_dist);
                        }
                        else
                        {
                            aux_d_resp.NumRespNeg += numRespNeg;
                            aux_d_resp.NumRespSatisf += numRespSatisf;
                            aux_d_resp.NumRespPos += numRespPos;
                        }
                    }

                    numRespNeg = 0;
                    numRespSatisf = 0;
                    numRespPos = 0;
                }
            }

        }



        private DistribuicaoRespostas getDistResp(int codCons)
        {
            DistribuicaoRespostas ret = null;

            foreach (DistribuicaoRespostas d_resp in listDistRespostas)
            {
                if (d_resp.CodConsideracao == codCons) return d_resp;
            }


            return ret;
        }

        /*
         * 0 -> Negativo
         * 1 -> Satisfatorio
         * 2 -> Positivo
         */
        private int getSatisf(int val_resp, int escalaMin, int escalaMax, int minResp)
        {
            if (val_resp < minResp) return 0;
            if ((val_resp) <= (escalaMax * 0.4)) return 0;
            if ((val_resp) <= (escalaMax * 0.7)) return 1;

            return 2;
        }

        public override int imprimir()
        {
            calcular();
            Dados.DadosRelatorio da = new Dados.DadosRelatorio();
            return da.imprimirCliente(this);
        }

        public List<Avaliacao.Avaliacao> L_aval_cli
        {
            get { return l_aval_cli; }
            set { l_aval_cli = value; }
        }

        public FormatoAvaliacaoCliente Form_aval_cli
        {
            get { return form_aval_cli; }
            set { form_aval_cli = value; }
        }

        public int Num
        {
            get { return num; }
            set { num = value; }
        }

        public int NumFeminino
        {
            get { return numFeminino; }
            set { numFeminino = value; }
        }

        public int NumMasculino
        {
            get { return numMasculino; }
            set { numMasculino = value; }
        }

        public List<int> ListaIdades
        {
            get { return listaIdades; }
            set { listaIdades = value; }
        }

        public Dictionary<int, int> MapHabilQtd
        {
            get { return mapHabilQtd; }
            set { mapHabilQtd = value; }
        }

        public List<DistribuicaoRespostas> ListDistRespostas
        {
            get { return listDistRespostas; }
            set { listDistRespostas = value; }
        }

    }
}
